// 引入必要的模块
const express = require('express');
/**
 * morgan 是一个 HTTP 请求日志记录中间件，用于 Express 应用程序中。它可以帮助开发者记录每个请求的详细信息，
 * 如时间、请求方法、URL、状态码等。在你的 app.js 文件中，morgan 已经被配置为使用自定义的时间格式，并且使用了 combined， 日志格式。
 */
const morgan = require('morgan');
const dayjs = require('dayjs');

const bodyParser = require('body-parser');
const cors = require('cors');
const cookieParser = require('cookie-parser');
// 启用 Gzip 压缩，以减少响应数据的大小，从而提高网页加载速度和性能
const compression = require('compression');
// 处理 JSON Web Tokens (JWT) 的中间件。它可以帮助你验证和解析 JWT，确保只有经过身份验证的请求才能访问受保护的路由。
const {expressjwt} = require('express-jwt'); // 确保正确导入expressJwt
const config = require('./config/db');
const core = require('./route/core');
const path = require('path'); // 确保引入 path 模块
const dbConnect = require('./config/dbConnect');
const http = require('http');


init(startServer)

async function init(callback) {
    try {
        await dbConnect.connect(config);
        callback(null, null);
    } catch (error) {
        callback(error);
    }
}

function startServer() {

    // 创建 Express 应用实例
    const app = express();


    // 使用 expressJwt 中间件
    app.use(
        expressjwt({secret: config.secretKey, algorithms: ["HS256"]}).unless({
            path: ['/login'],
        })
    )
    // 配置中间件
    app.use(cors());
    app.use(compression());
    // 调整json和urlencoded解析器的限制
    // app.use(bodyParser.json());
    app.use(bodyParser.json({limit: '50mb'}));
    app.use(bodyParser.urlencoded({extended: true, limit: '50mb'}));
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));
    // 接口请求时间
    morgan.token('time', function () {
        return dayjs().format("YYYY-MM-DD HH:mm:ss")
    });
    morgan.format('combined', ':time :remote-addr :method :url :status :res[content-length] - :response-time ms')
    app.use(morgan('combined'));

    app.use(function (req, res, next) {
        req.config = config;
        next();
    });
    // 引入其他路由文件
    core(app);

    // 启动服务器
    const PORT = process.env.PORT || 3000;
    // app.listen(PORT, () => {
    //     console.log(`Server is running on port ${PORT}`);
    // });

    const server = http.createServer(app);
    server.listen(PORT, () => {
        console.log(`Server is running on port ${PORT}`);
    })

    // 错误处理
    app.use((err, req, res, next) => {
        console.error(err.stack);
        res.status(500).send('Something broke!');
    });


}
